在昨天我們成功使用 EF Core Migration,在 DB 新增了 Table,但像是 nvarchar
欄位長度卻被設定為 MAX,這對於 DB 效能其實是很不好的,如果沒有特別的用途,建議還是不要設定為 MAX。
其實在建立 Model 時,應該就會發現我在時間的欄位都加上了 Column Attribute,將 TypeName 欄位格式指定為 datetime2。
ASP.NET Core 提供了許多 Attribute,Column 就是其中一種,其實 Column
實際上的 ClassName 是 ColumnAttribute
,但 ASP.NET Core 會自動判別繼承 Attribute
的 ClassName,所以只要你的 Class 是繼承 Attribute
且 ClassName 最後有 Attribute 的字,實際上在使用時可以省略 Attrubute
。
而這裡指定長度所使用的 Attribute 是 StringLength
:
在 Title
,除了指定 最大 50 字元外,也指定了最少需要 5 字元,並且當輸入不符合此範圍的字元數的話,顯示自訂的錯誤訊息。
接著在 .NET CLI 輸入 dotnet ef migrations add SetEventsCol
,這裡看到新增的 Migrations 內容:
Up
Function 的作用為:當執行 dotnet ef datebase update
時,所執行的 Function,也就是更新 DB 的內容;
而 Down
Function 即是退回上一個 Migration 時,會執行的方法,可以看到兩者的內容是相反的。
從 Up
來看,可以發現 Title
欄位的 type
欄位型別被設定為 nvarchar(50)
了,也就代表我們在 Model 設定的 StringLength
是成功的。
接著我們就執行 dotnet ef datebase update
,更新 DB 的 Events Table:
欄位長度設定成功!
其他還有一些設定,e.g. 欄位不允許 Null -> Model 設定 [Required]
等。
Table 建立好了,就代表我們現在可以執行 CRUD 了,ASP.NET Core 提供了很棒的功能,叫做 Scaffolding,可以稱之為範本新增。
我們可以用建立好的 Model 以及 DbContext,透過 Scaffolding 來自動建立最基礎的 CRUD 頁面,且頁面不是只有顯示 Table 的所有欄位,更幫我們建立了 CRUD 的後端 Function。
對 Controller 資料夾右鍵選擇加入 > 新增 Scaffold 項目,並選擇 使用 Entity Framework 執行檢視的 MVC 控制器:
新增後,可以看到 Scaffolding 幫我們新增了 Controller 與 View,真的很快速。
接著直接建置起來,來看看這些功能是不是真的可以使用。
可以看到 Events Table 中的欄位都列出來了,除了作為 Primary Key 的 Id
。
點進 Create 頁面可以看到每個 input 都自動帶入該有的形式,例如 datetime2 型別是 datepicker 的 input。
如果 input 不符合 Attribute 的設定,則會直接顯示指定的錯誤訊息出來。
欄位都填好送出後,在 Index 頁看到成功新增了一筆資料。
至此 Events 基本的 CRUD 都建置完成了,但這些都還不符合功能需求,後續我們再慢慢修改。
今天我們總算做出 CRUD 的功能了,但是有沒有發現一個問題,就是 CreateTime, CreateUser 等欄位理論上不應該由使用者自己填入,應該是在新增資料時,在後端自動帶入。
但如果不想在 Model 使用 [Required]
呢?
明天將介紹另一個設定 Table 屬性的方法: Fluent API。
我們明天見!
Data Annotations - StringLength Attribute in EF 6 & EF Core